//单生产单消费
//构建任务方式2(给消费者派发任务，让消费者执行对应的任务)
#include"BlockQueue.hpp"
#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include"Task.hpp"

//消费者
void *consumer(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t>*>(args);
    while(true)
    {
    //1.消费任务
        task_t t = bq->Pop();      //进行构建任务并pop  队列拿任务
    //2.处理任务 ---> 处理任务的时候，这个任务，已经被拿到线程的上下文中了，不属于队列了！
        t();      //进行执行对应任务
    }
}

//生产者
void *productor(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t>*>(args);
    while(true)
    {   
    //1.获得任务
        sleep(1);
        std::cout<<"生产了一个任务：" << std::endl;
    //2.生产任务
        bq->Equeue(Download);
    }
}

int main()
{
    //申请阻塞队列
    BlockQueue<task_t> *bq = new BlockQueue<task_t>();

    //构建生产和消费者
    pthread_t c,p;

    pthread_create(&c,nullptr,consumer,bq);
    pthread_create(&p,nullptr,productor,bq);

    pthread_join(c,nullptr);
    pthread_join(p,nullptr);
    return 0;
}








//构建任务方式1
// //阻塞队列传任务
// #include"BlockQueue.hpp"
// #include<iostream>
// #include<pthread.h>
// #include<unistd.h>
// #include"Task.hpp"

// void *consumer(void *args)
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task>*>(args);
//     while(true)
//     {
//         sleep(1);
//         Task t = bq->Pop();      //进行构建任务并pop  队列拿任务
        
//         t.Execute();      //进行执行
//         std::cout<<"消费了一个任务： "<< t.X() << "+" << t.Y() << "=" << t.Result() <<std::endl;
//     }
// }

// void *productor(void *args)
// {
//     int x = 1;
//     int y = 1;
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task>*>(args);
//     while(true)
//     {       
//         //生产者一秒生产一个
//         // sleep(1);
//         std::cout<<"生产了一个任务："<< x << "+" << y << "=?" << std::endl;
//         Task t(x,y);
//         bq->Equeue(t);    //把数据入进去
//         x++,y++;
//     }
// }

// int main()
// {
//     //扩展：阻塞队列：阻塞队列不是只能放整数，可以放任务！！！
//     //申请阻塞队列
//     BlockQueue<Task> *bq = new BlockQueue<Task>();

//     //构建生产和消费者
//     pthread_t c,p;

//     pthread_create(&c,nullptr,consumer,bq);
//     pthread_create(&p,nullptr,productor,bq);

//     pthread_join(c,nullptr);
//     pthread_join(p,nullptr);

//     return 0;
// }


